﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using AutoWelding.BLL;
using AutoWelding.Models;
using AutoWelding.Utils;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel;

namespace AutoWelding.Views.Users
{
    public partial class UsersForm : Form
    {
        #region 加载
        public UsersForm()
        {
            InitializeComponent();
        }

        private UserBLL userBLL = new UserBLL();

        private void UsersForm_Load(object sender, EventArgs e)
        {
            if (!AppContext.IsLoggedIn)
            {
                MessageBox.Show("用户未登录或会话已过期！", "错误");
                LogHelper.Warn(GetType(), $"用户未登录或会话已过期");
                this.Close();
                return;
            }
            Debug.WriteLine($"当前用户: {AppContext.CurrentUser} + 权限：{AppContext.ThisUserIdentity}");

            //指定列,进行绑定，不绑定的列不显示。
            dgv_userdata.AutoGenerateColumns = false;
            //加载  状态下拉框
            LoadUserState();
            //加载  用户信息
            LoadUserInfo();
        }
        #endregion

        #region 加载用户信息
        //查询按钮
        private void btn_select_Click(object sender, EventArgs e)
        {
            LoadUserInfo();
            dgv_userdata.Invalidate();
        }

        /// <summary>
        /// 加载用户信息
        /// </summary>
        private void LoadUserInfo()
        {
            //用户名  输入框 
            string username = txt_username.Text;
            //是否删除
            bool isDeleted = checkBox_del.Checked;
            //获取 状态
            int userStatus = (int)cbx_status.SelectedValue;
            //判断表格列的显示
            if (!isDeleted)
            {
                dgv_userdata.Columns["user_status"].Visible = true;
                dgv_userdata.Columns["col_update"].Visible = true;
                dgv_userdata.Columns["col_delete"].Visible = true;
                dgv_userdata.Columns["col_remove"].Visible = false;
                dgv_userdata.Columns["col_recover"].Visible = false;
            }
            else
            {
                dgv_userdata.Columns["user_status"].Visible = false;
                dgv_userdata.Columns["col_update"].Visible = false;
                dgv_userdata.Columns["col_delete"].Visible = false;
                dgv_userdata.Columns["col_remove"].Visible = true;
                dgv_userdata.Columns["col_recover"].Visible = true;
            }
            //加载用户信息
            List<UserModel> usersList = userBLL.GetUsers(userStatus, username, isDeleted);
            if (usersList.Count > 0)
            {
                dgv_userdata.DataSource = usersList;
                btn_deleted.Visible = true;
                //UpdateLinkColumnTexts();
            }
            else
            {
                dgv_userdata.DataSource = null;
                btn_deleted.Visible = false;
            }
        }
        #endregion

        #region panel_condition内部控件 点击事件
        /// <summary>
        /// 批量删除按钮点击事件
        /// </summary>
        private void btn_deleted_Click(object sender, EventArgs e)
        {
            // 权限检查 - 只有管理员及以上可以批量删除
            if (!AppContext.IsAdmin)
            {
                MessageBox.Show("普通用户无法使用 [用户批量删除] 功能！", "权限不足");
                LogHelper.Info(GetType(),
                    $"操作：[用户批量删除] | " +
                    $"权限不足 | " +
                    $"操作者：{AppContext.CurrentUser.NickName}({AppContext.CurrentUser.UserName})");
                return;
            }

            //初始化一个LIst<int>
            List<int> selectedUserIds = new List<int>();
            //遍历datagridview每一行
            foreach (DataGridViewRow row in dgv_userdata.Rows)
            {
                //获取每行的数据绑定对象
                UserModel user = row.DataBoundItem as UserModel;
                //获取每行的复选单元格
                DataGridViewCheckBoxCell checkBoxCell = row.Cells["column_check"] as DataGridViewCheckBoxCell;
                //检查复选框是否选中
                if (checkBoxCell.FormattedValue.ToString() == "True")
                {
                    if (user.UserIdentity == 0)
                    {
                        MessageBox.Show("不能删除超级管理员！", "操作限制");
                        return;
                    }
                    // 判断用户是否处于启用状态
                    if (user.UserStatus == 1) // 假设 1 表示“启用”
                    {
                        MessageBox.Show("存在处于启用状态的用户，不能删除，请先禁用这些用户！", "提示");
                        return;
                    }

                    //将选中的行ID添加到List<int>中
                    selectedUserIds.Add(user.UserId);
                }
            }
            if (selectedUserIds.Count > 0)
            {
                if (MessageBox.Show("确定要删除选择的用户吗？", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    if (userBLL.LogicDeleteUser(selectedUserIds))
                    {
                        LoadUserInfo();
                        MessageBox.Show($"成功删除 {selectedUserIds.Count} 个用户！", "批量操作完成",
                            MessageBoxButtons.OK, MessageBoxIcon.Information);
                        //LogHelper.Info(GetType(), $"批量删除了 {selectedUserIds.Count} 个用户");
                        LogHelper.Info(GetType(),
                            $"操作：[用户批量删除] | " +
                            $"操作者：{AppContext.CurrentUser.NickName}({AppContext.CurrentUser.UserName}) | " +
                            $"批量删除了 {selectedUserIds.Count} 个用户");
                    }
                    else
                    {
                        MessageBox.Show("删除失败！", "提示");
                        LogHelper.DeBug(GetType(),
                            $"操作：[用户批量删除] | " +
                            $"失败 | " +
                            $"操作者：{AppContext.CurrentUser.NickName}({AppContext.CurrentUser.UserName}");
                    }
                }
            }
            else
            {
                MessageBox.Show("请选择要删除的用户！", "提示");
            }

        }

        /// <summary>
        /// 加载用户状态下拉框
        /// </summary>
        private void LoadUserState()
        {
            //创建一个匿名类列表表示用户状态
            var states = new List<dynamic>
            {
                new { Text = "--请选择--", Value = 2 },
                new { Text = "正常", Value = 1 },
                new { Text = "禁用", Value = 0 }
            };
            cbx_status.Items.Add("启用");
            // 设置 ComboBox 的显示成员和值成员
            cbx_status.DataSource = states;
            cbx_status.DisplayMember = "Text";
            cbx_status.ValueMember = "Value";

            // 默认选中“请选择”
            cbx_status.SelectedIndex = 0;
        }

        /// <summary>
        /// 添加用户按钮点击事件
        /// </summary>
        private void btn_insert_Click(object sender, EventArgs e)
        {
            if (!AppContext.IsAdmin)
            {
                MessageBox.Show("普通用户无法使用 [用户添加] 功能！", "权限不足");
                LogHelper.Info(GetType(),
                    $"操作：[用户添加] | " +
                    $"权限不足 | " +
                    $"操作者：{AppContext.CurrentUser.NickName}({AppContext.CurrentUser.UserName})");
                return;
            }
            ShowUserInfoForm(1, 0);
        }

        /// <summary>
        /// 展示用户信息页面------添加或修改用户信息
        /// </summary>
        private void ShowUserInfoForm(int actType, int userId)
        {
            UserInfoForm userInfoForm = new UserInfoForm();
            userInfoForm.Tag = new AddOrUpdateModel()
            {
                ActType = actType,
                FId = userId
            };
            //刷新用户信息列表
            userInfoForm.ReLoadList += () => LoadUserInfo();
            userInfoForm.ShowDialog();
        }
        #endregion

        #region 不可操作变灰
        /// <summary>
        /// 动态判断 如果用户的 UserIdentity 是 0 那么他是超级管理员 那么这行只读 变灰
        /// </summary>
        private void dgv_userdata_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
        {
            var row = dgv_userdata.Rows[e.RowIndex];
            var user = row.DataBoundItem as UserModel;

            // 超级管理员行：整行只读 + 变灰
            if (user != null && user.UserIdentity == 0)
            {
                row.ReadOnly = true; // 禁止编辑
                row.DefaultCellStyle.BackColor = Color.LightGray; // 整行背景色
                row.DefaultCellStyle.ForeColor = Color.Gray; // 文字颜色
            }
        }
        #endregion

        #region dgv控件 点击事件
        // 合并 CellClick 和 CellFormatting
        private void dgv_userdata_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex < 0 || e.ColumnIndex < 0) return;

            var column = dgv_userdata.Columns[e.ColumnIndex];
            var targetUser = dgv_userdata.Rows[e.RowIndex].DataBoundItem as UserModel;
            if (targetUser == null) return;

            // 处理状态列点击
            if (column.Name == "user_status")
            {
                // 权限检查
                if (!CheckPermission(targetUser, "change_status"))
                {
                    return;
                }

                // 切换状态
                targetUser.UserStatus = targetUser.UserStatus == 0 ? 1 : 0;
                if (userBLL.UpdateUser(targetUser))
                {
                    dgv_userdata.InvalidateRow(e.RowIndex);
                    MessageBox.Show($"用户已{(targetUser.UserStatus == 0 ? "禁用" : "启用")}！",
                        "操作成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    LogHelper.Info(GetType(),
                            $"操作：[用户状态切换] | " +
                            $"操作者：{AppContext.CurrentUser.NickName}({AppContext.CurrentUser.UserName}) | " +
                            $"目标用户：{targetUser.NickName}({targetUser.UserName})");
                }
                else
                {
                    MessageBox.Show("状态更新失败，请重试！", "操作失败",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                    LogHelper.DeBug(GetType(),
                            $"操作：[用户状态切换] | " +
                            $"失败 | " +
                            $"操作者：{AppContext.CurrentUser.NickName}({AppContext.CurrentUser.UserName}) | " +
                            $"目标用户：{targetUser.NickName}({targetUser.UserName})");
                }
                return;
            }

            // 处理操作列点击
            if (column.Name.StartsWith("col_"))
            {
                string action = dgv_userdata.Rows[e.RowIndex].Cells[e.ColumnIndex].FormattedValue?.ToString();

                // 权限检查
                if (!CheckPermission(targetUser, action))
                {
                    return;
                }

                // 执行操作
                switch (action)
                {
                    case "修改":
                        ShowUserInfoForm(2, targetUser.UserId);
                        break;
                    case "删除":
                        HandleDeleteUser(targetUser);
                        break;
                    case "恢复":
                        HandleRecoverUser(targetUser);
                        break;
                    case "移除":
                        HandleRemoveUser(targetUser);
                        break;
                }
            }
        }
        #endregion

        #region 其他事件
        /// <summary>
        /// 忽视  类型转换错误
        /// </summary>
        private void dgv_userdata_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            // 忽略类型转换错误
            if (e.Context == DataGridViewDataErrorContexts.Commit)
            {
                e.Cancel = false;
            }
        }

        /// <summary>
        /// 状态列格式化
        /// </summary>
        private void dgv_userdata_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (dgv_userdata.Columns[e.ColumnIndex].Name == "user_status")
            {
                if (e.Value is int status)
                {
                    e.Value = status == 0 ? "启用" : "禁用";
                    e.FormattingApplied = true;
                }
            }
        }
        #endregion

        #region 将操作封装成独立方法
        private void HandleDeleteUser(UserModel user) // 删除
        {
            if (MessageBox.Show($"确定要删除用户 {user.NickName} 吗？", "确认删除",
                MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
            {
                try
                {
                    if (userBLL.LogicDeleteUser(new List<int> { user.UserId }))
                    {
                        LoadUserInfo();
                        MessageBox.Show($"用户 {user.NickName} 删除成功！", "操作成功",
                            MessageBoxButtons.OK, MessageBoxIcon.Information);
                        LogHelper.Info(GetType(),
                            $"操作：[用户删除] | " +
                            $"操作者：{AppContext.CurrentUser.NickName}({AppContext.CurrentUser.UserName}) | " +
                            $"目标用户：{user.NickName}({user.UserName})");
                    }
                    else
                    {
                        MessageBox.Show("删除操作执行失败，请重试！", "操作失败",
                            MessageBoxButtons.OK, MessageBoxIcon.Error);
                        LogHelper.DeBug(GetType(),
                            $"操作：[用户删除] | " +
                            $"失败 | " +
                            $"操作者：{AppContext.CurrentUser.NickName}({AppContext.CurrentUser.UserName}) | " +
                            $"目标用户：{user.NickName}({user.UserName})");
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"删除过程中发生错误: {ex.Message}", "操作异常",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                    LogHelper.Error(GetType(),
                            $"操作：[用户删除] | " +
                            $"失败 | " +
                            $"操作者：{AppContext.CurrentUser.NickName}({AppContext.CurrentUser.UserName}) | " +
                            $"目标用户：{user.NickName}({user.UserName})");
                }
            }
        }

        private void HandleRecoverUser(UserModel user) // 恢复
        {
            user.IsDelete = 1; // 0：已经删除、1：未删除
            if (userBLL.UpdateUser(user))
            {
                LoadUserInfo();
                MessageBox.Show("恢复成功！", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                LogHelper.Info(GetType(),
                            $"操作：[用户恢复] | " +
                            $"操作者：{AppContext.CurrentUser.NickName}({AppContext.CurrentUser.UserName}) | " +
                            $"目标用户：{user.NickName}({user.UserName})");
            }
        }

        private void HandleRemoveUser(UserModel user) // 移除
        {
            if (MessageBox.Show($"确定要永久删除用户 {user.NickName} 吗？此操作不可恢复！", "警告",
                MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
            {
                if (userBLL.DeleteUser(user.UserId))
                {
                    LogHelper.Info(GetType(),
                            $"操作：[用户永久删除] | " +
                            $"操作者：{AppContext.CurrentUser.NickName}({AppContext.CurrentUser.UserName}) | " +
                            $"目标用户：{user.NickName}({user.UserName})");
                    LoadUserInfo();
                    MessageBox.Show("永久删除成功！", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }
        #endregion

        #region 判断用户权限
        /// <summary>
        /// 判断用户权限
        /// </summary>
        private bool CheckPermission(UserModel targetUser, string action)
        {
            // 获取当前用户
            var currentUser = AppContext.CurrentUser;

            // 1. 检查是否已登录
            if (!AppContext.IsLoggedIn)
            {
                MessageBox.Show("请先登录系统！", "权限不足");
                return false;
            }

            // 2. 自我操作保护
            if (currentUser.UserId == targetUser.UserId)
            {
                MessageBox.Show("不能对当前登录用户执行此操作！", "操作限制");
                return false;
            }

            // 3. 权限层级定义
            bool isTargetSuperAdmin = targetUser.UserIdentity == 0;
            bool isTargetAdmin = targetUser.UserIdentity == 1;
            bool isTargetNormalUser = targetUser.UserIdentity == 2;

            if (isTargetSuperAdmin)
            {
                MessageBox.Show("不能修改超级管理员状态！", "操作限制");
                return false;
            }

            // 4. 根据操作类型检查权限
            switch (action)
            {
                case "change_status":
                    // 状态修改的特殊权限检查
                    // 超级管理员不可操作
                    // 只有管理员及以上可以修改状态
                    if (isTargetSuperAdmin)
                    {
                        MessageBox.Show("不能修改超级管理员状态！", "操作限制");
                        return false;
                    }
                    if (!AppContext.IsAdmin)
                    {
                        MessageBox.Show("您的操作权限不足！", "权限不足");
                        return false;
                    }
                    return true;

                case "修改":
                    // 超级管理员可以修改所有非超级管理员
                    // 管理员可以修改普通用户
                    if (isTargetSuperAdmin)
                    {
                        MessageBox.Show("不能修改超级管理员！", "操作限制");
                        return false;
                    }
                    if (!((AppContext.IsSuperAdmin && !isTargetSuperAdmin) ||
                          (AppContext.IsAdmin && isTargetNormalUser)))
                    {
                        MessageBox.Show("您的操作权限不足！", "权限不足");
                        return false;
                    }
                    return true;

                case "删除":
                    //// 超级管理员可以删除所有非超级管理员
                    //// 管理员可以删除普通用户
                    if (isTargetSuperAdmin)
                    {
                        MessageBox.Show("不能删除超级管理员！", "操作限制");
                        return false;
                    }
                    if (targetUser.UserStatus == 1)
                    {
                        MessageBox.Show("不能删除启用状态的用户！", "操作限制");
                        return false;
                    }
                    if (!((AppContext.IsSuperAdmin && !isTargetSuperAdmin) ||
                          (AppContext.IsAdmin && isTargetNormalUser)))
                    {
                        MessageBox.Show("您的操作权限不足！", "权限不足");
                        return false;
                    }
                    return true;

                case "恢复":
                    // 超级管理员可以恢复所有非超级管理员
                    // 管理员可以恢复普通用户
                    if (isTargetSuperAdmin)
                    {
                        MessageBox.Show("不能恢复超级管理员！", "操作限制");
                        return false;
                    }
                    if (!((AppContext.IsSuperAdmin && !isTargetSuperAdmin) ||
                          (AppContext.IsAdmin && isTargetNormalUser)))
                    {
                        MessageBox.Show("您的操作权限不足！", "权限不足");
                        return false;
                    }
                    return true;

                case "移除":
                    // 只有超级管理员可以永久删除普通用户
                    // 不能删除超级管理员和管理员
                    if (!AppContext.IsSuperAdmin)
                    {
                        MessageBox.Show("只有超级管理员可以永久删除用户！", "权限不足");
                        return false;
                    }
                    //if (!isTargetNormalUser)
                    //{
                    //    MessageBox.Show("只能永久删除普通用户！", "操作限制");
                    //    return false;
                    //}
                    return true;

                default:
                    MessageBox.Show("未知操作类型！", "错误");
                    LogHelper.Error(GetType(),
                            $"操作：[用户权限判断] | " +
                            $"未知操作类型！");
                    return false;
            }
        }
        #endregion
    }
}
